// facade pattern 外观模式或者称为门面模式
//通过一个类，将涉及的一些列方法进行包装，从而实现接口更容易被调用
//比如：基金和股票的关系，每个不同的基金下面，有不同的股票组合方案；
#include <iostream>
#include <memory>

class SubSystemOne
{
public:
    using ptr = std::shared_ptr<SubSystemOne>;
    void methodOne()
    {
        std::cout << "子系统方法1" << std::endl;
    }
};
class SubSystemTwo
{
public:
    using ptr = std::shared_ptr<SubSystemTwo>;
    void methodTwo()
    {
        std::cout << "子系统方法2" << std::endl;
    }
};
class SubSystemThree
{
public:
    using ptr = std::shared_ptr<SubSystemThree>;
    void methodThree()
    {
        std::cout << "子系统方法3" << std::endl;
    }
};
//外观模式，
class Facade
{
public:
    using ptr = std::shared_ptr<Facade>;
    Facade():one(new SubSystemOne),two(new SubSystemTwo),three(new SubSystemThree)
    {   }
    //下面三种方法分别实现不同子系统方法的组合方案
    //主函数只需要调用高层的方法即可，而无需例会底层的实现
    void methodA()
    {
        one->methodOne();
        two->methodTwo();
    }
    void methodB()
    {
        one->methodOne();
        three->methodThree();
    }
    void methodC()
    {
        two->methodTwo();
        three->methodThree();
    }
private:
    SubSystemOne::ptr one;
    SubSystemTwo::ptr two;
    SubSystemThree::ptr three;
};

int main(int argc, char** argv)
{
    Facade::ptr facade(new Facade());
    std::cout<<"**********Method A**********"<<std::endl;
    facade->methodA();
    std::cout<<"**********Method B**********"<<std::endl;
    facade->methodB();
    std::cout<<"**********Method C**********"<<std::endl;
    facade->methodC();
}